package top.healthylife.gateway.platform.zd.api.api.querybynum;

import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import top.healthylife.basics.utils.exception.BusinessException;
import top.healthylife.gateway.core.service.ParentFace;
import top.healthylife.gateway.dto.annotation.ApiServiceExplain;
import top.healthylife.gateway.platform.zd.api.api.querybynum.oldimpl.WSQueryByNumService;
import top.healthylife.gateway.platform.zd.api.config.SystemConfig;
import top.healthylife.gateway.platform.zd.api.utils.ZdHttpUtil;
import top.healthylife.gateway.platform.zd.dto.querybynum.req.ZdReqQueryByNumDto;
import top.healthylife.gateway.platform.zd.dto.querybynum.res.ZdResQueryByNumDto;

/**
 * @author : GaoZeXi
 * @date 2022/1/11 16:32
 */
@Slf4j
@Service
@AllArgsConstructor
@ApiServiceExplain(price = 20, apiName = "按登记证明编号查询", info = "第三方通过该接口进行按登记证明编号查询。")
public class ZdQueryByNumApi implements ParentFace<ZdReqQueryByNumDto, ZdResQueryByNumDto> {
    static final String SERVICE_NAME = "QueryByNumService";
    WSQueryByNumService wsQueryByNumService;

    @Override
    public ZdResQueryByNumDto execute(ZdReqQueryByNumDto t) {
        SystemConfig systemConfig = ZdHttpUtil.systemConfigInfo();
        try {
            byte[] bytes = wsQueryByNumService.queryByNum(systemConfig.getPlatformAuthCode().getBytes(), systemConfig.getToken(), t.getRegisterNo().getBytes());
        } catch (Exception e) {
            throw new BusinessException("按登记证明编号查询 接口查询失败");
        }
        return ZdHttpUtil.httpRequest(t, SERVICE_NAME, ZdResQueryByNumDto.class);
    }


    /**
     * 将查询信息转响应对象
     * 压缩包里不仅仅有xml还有pdf文件
     *
     * @param resByte 中登网返回的xml
     * @return .
     */
    public static ZdResQueryByNumDto queryToRes(byte[] resByte) {
        //final String fail = "002";
        //final String success = "001";
        //ZdResQueryByNumDto res = new ZdResQueryByNumDto();
        //ZipInputStream zis = null;
        //try {
        //    zis = new ZipInputStream(new ByteArrayInputStream(resByte));
        //    ZipEntry ze = null;
        //    // 由于 Dom4j和文件上传都会关闭读入流,使用zip流的getNextEntry方法会报错,故这里使用for循环,即,已确定zip内的文件数为2
        //    for (int i = 0; i < 2; i++) {
        //        // 解析zip内部的文件 (包含一个xml和可能会出现的pdf)
        //        try {
        //            // 吐槽,ZipInputStream类设计得真难用,所有方法全部抛IO异常
        //            ze = zis.getNextEntry();
        //        } catch (IOException e) {
        //            log.info("压缩包文件读取完毕");
        //            break;
        //        }
        //        String zipInnerFileName = ze.getName();
        //        if (zipInnerFileName.endsWith(".xml")) {
        //            SAXReader reader = new SAXReader();
        //            Document document = reader.read(zis);
        //            Element feedbackEle = document.getRootElement();
        //            // xml由外向内解析
        //            List<QueryResData> queryResDataList = new ArrayList<>();
        //            String regResCode = feedbackEle.elementText("registerresult");
        //            Integer totalRows = Integer.valueOf(feedbackEle.elementText("totalrows"));
        //            res.setName(feedbackEle.elementText("name"))
        //                    .setCondition(feedbackEle.elementText("condition"))
        //                    .setTime(feedbackEle.elementText("time"))
        //                    .setTotalRows(totalRows)
        //                    .setQueryConfirmNo(feedbackEle.elementText("QueryConfirmNo"))
        //                    .setResults(queryResDataList)
        //                    .setRegResCode(regResCode);
        //            // 设置错误码
        //            if (fail.equals(regResCode)) {
        //                res.setErrors(feedbackEle.elements("errors").stream().map(e -> e.elementText("error")).collect(Collectors.toList()));
        //            }
        //            // 判断是否存在多业务类型的条目 (中间层)
        //            if (!fail.equals(regResCode) && totalRows > 0) {
        //                List<Element> results = feedbackEle.element("data").elements("results");
        //                Element element = results.get(0);
        //                Object data = element.getData();
        //                log.info("================", data);
        //                for (Element result : results) {
        //                    Integer inRows = Integer.valueOf(result.elementText("rows"));
        //                    List<QueryResDataItem> dataItems = new ArrayList<>();
        //                    QueryResData resData = new QueryResData().setBusType(RegBusinessType.getByCode(result.elementText("businesstype")))
        //                            .setRows(inRows)
        //                            .setDataItems(dataItems);
        //                    //判断该业务类型的登记类型详情的条目 (最里层)
        //                    if (inRows > 0) {
        //                        // 将XML的result集合放入results(最里层放入中间层)
        //                        List<Element> resultItem = result.elements("result");
        //                        for (Element item : resultItem) {
        //                            dataItems.add(new QueryResDataItem()
        //                                    .setRegNo(item.elementText("registerno"))
        //                                    .setRegTime(item.elementText("registertime"))
        //                                    .setRegExpireDate(item.elementText("registerexpiredate"))
        //                                    .setRegType(RegType.getByCode(item.elementText("registertype")))
        //                                    .setSpName(item.elementText("spname"))
        //                            );
        //                            log.info("item==============>>>>{},{},{}",item.toString(),item.elements(),item.getData());
        //                        }
        //                    }
        //                    // 将XML的results集合放入外层(中间层放入最外层)
        //                    queryResDataList.add(resData);
        //                }
        //            }
        //
        //        } else if (zipInnerFileName.endsWith(".pdf")) {
        //            // 上传pdf附件
        //            String bucketName = SpringContextUtil.getBean(ProjectConfig.class).getBucketName();
        //            FileApi fileApi = SpringContextUtil.getBean(FileApi.class);
        //            MultipartFile mulFile = new MockMultipartFile("file", zipInnerFileName, "text/plain; charset=ISO-8859-1", zis);
        //            fileApi.uploadFile(mulFile, zipInnerFileName, bucketName, "querypdf");
        //            //设置到响应对象中
        //            res.setFileName(zipInnerFileName);
        //            res.setBucketName(bucketName);
        //            zis.closeEntry();
        //        }
        //    }
        //
        //} catch (Exception e) {
        //    log.error("中登网返回转对象失败", e);
        //    res.setRegResCode(fail);
        //} finally {
        //    IoUtil.close(zis);
        //}
        //return res;
        return null;
    }
}
